#include "stepper_motor.h"
#include "Delay.h"

// 初始化GPIO
void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
    // 使能GPIOA时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    // 配置PA0-PA3为推挽输出
    GPIO_InitStructure.GPIO_Pin = IN1_A_PIN | IN2_B_PIN | IN3_C_PIN | IN4_D_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(MOTOR_GPIO, &GPIO_InitStructure);
}

// 发送脉冲信号
void step_motor_28BYJ48_send_pulse(uint8_t step, uint8_t dir)
{
    uint8_t temp = step;
    
    if(dir == 0)    // 如果为逆时针旋转
        temp = 7 - step; // 调换节拍信号
        
    switch(temp) // 8个节拍控制：A->AB->B->BC->C->CD->D->DA
    {
        case 0: 
            GPIO_SetBits(MOTOR_GPIO, IN1_A_PIN);
            GPIO_ResetBits(MOTOR_GPIO, IN2_B_PIN | IN3_C_PIN | IN4_D_PIN);
            break;
        case 1: 
            GPIO_SetBits(MOTOR_GPIO, IN1_A_PIN | IN2_B_PIN);
            GPIO_ResetBits(MOTOR_GPIO, IN3_C_PIN | IN4_D_PIN);
            break;
        case 2: 
            GPIO_SetBits(MOTOR_GPIO, IN2_B_PIN);
            GPIO_ResetBits(MOTOR_GPIO, IN1_A_PIN | IN3_C_PIN | IN4_D_PIN);
            break;
        case 3: 
            GPIO_SetBits(MOTOR_GPIO, IN2_B_PIN | IN3_C_PIN);
            GPIO_ResetBits(MOTOR_GPIO, IN1_A_PIN | IN4_D_PIN);
            break;
        case 4: 
            GPIO_SetBits(MOTOR_GPIO, IN3_C_PIN);
            GPIO_ResetBits(MOTOR_GPIO, IN1_A_PIN | IN2_B_PIN | IN4_D_PIN);
            break;
        case 5: 
            GPIO_SetBits(MOTOR_GPIO, IN3_C_PIN | IN4_D_PIN);
            GPIO_ResetBits(MOTOR_GPIO, IN1_A_PIN | IN2_B_PIN);
            break;
        case 6: 
            GPIO_SetBits(MOTOR_GPIO, IN4_D_PIN);
            GPIO_ResetBits(MOTOR_GPIO, IN1_A_PIN | IN2_B_PIN | IN3_C_PIN);
            break;
        case 7: 
            GPIO_SetBits(MOTOR_GPIO, IN1_A_PIN | IN4_D_PIN);
            GPIO_ResetBits(MOTOR_GPIO, IN2_B_PIN | IN3_C_PIN);
            break;
        default: // 停止相序
            GPIO_ResetBits(MOTOR_GPIO, IN1_A_PIN | IN2_B_PIN | IN3_C_PIN | IN4_D_PIN);
            break;
    }
}
// 顺时针转动
void MotorCW(uint8_t Speed)
{
    static uint8_t step1;
    step_motor_28BYJ48_send_pulse(step1, 1);
    Delay_ms(Speed); // 转速调节
    step1++;
    step1 %= 8;
}

// 逆时针转动
void MotorCCW(uint8_t Speed)
{
    static uint8_t step2;
    step_motor_28BYJ48_send_pulse(step2, 0);
    Delay_ms(Speed); // 转速调节
    step2++;
    step2 %= 8;
}

// 停止转动
void MotorStop(void)
{
    step_motor_28BYJ48_send_pulse(8, 1);
}
